package top.arryweb.application.common.config;

import com.github.xiaoymin.swaggerbootstrapui.annotations.EnableSwaggerBootstrapUI;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
 * @Description Swagger配置文件
 * @Author mac
 * @Date 2021/5/28
 **/

@Configuration
@EnableSwagger2
@EnableSwaggerBootstrapUI // 开启SwaggerBootstrapUI  http://localhost:8089/doc.html
public class SwaggerConfig extends WebMvcConfigurationSupport {

  @Bean
  public Docket createRestApi() {
    return new Docket(DocumentationType.SWAGGER_2)  // DocumentationType.SWAGGER_2 固定的，代表swagger2
//      .groupName("分布式任务系统") // 如果配置多个文档的时候，那么需要配置groupName来分组标识
        .apiInfo(apiInfo()) // 用于生成API信息
        .select() // select()函数返回一个ApiSelectorBuilder实例,用来控制接口被swagger做成文档
        .apis(RequestHandlerSelectors
            .basePackage("top.arryweb.application.controller")) // 用于指定扫描哪个包下的接口
        .paths(PathSelectors.any())// 选择所有的API,如果你想只为部分API生成文档，可以配置这里
        .build();
  }

  /**
   * 用于定义API主界面的信息，比如可以声明所有的API的总标题、描述、版本
   */
  private ApiInfo apiInfo() {
    return new ApiInfoBuilder()
        .title("BookKeep项目API") //  可以用来自定义API的主标题
        .description("BookKeep项目SwaggerAPI管理") // 可以用来描述整体的API
        .termsOfServiceUrl("") // 用于定义服务的域名
        .version("1.0") // 可以用来定义版本。
        .build();
  }

  @Override
  protected void addResourceHandlers(ResourceHandlerRegistry registry) {
    // 解决静态资源无法访问
    registry.addResourceHandler("/**")
        .addResourceLocations("classpath:/static/");
    // 解决swagger无法访问
    registry.addResourceHandler("/swagger-ui.html")
        .addResourceLocations("classpath:/META-INF/resources/");
    // 解决swagger的js文件无法访问
    registry.addResourceHandler("/webjars/**")
        .addResourceLocations("classpath:/META-INF/resources/webjars/");
  }
}

/**
 * Spring Boot整合swagger使用教程 https://www.cnblogs.com/progor/p/13297904.html
 */
